//: C07:SuperVar.cpp
// From Thinking in C++, 2nd Edition
// Available at http://www.BruceEckel.com
// (c) Bruce Eckel 1999
// Copyright notice in Copyright.txt
// A super-variable
#include <iostream>
using namespace std;

class SuperVar
{
    enum {
        character,
        integer,
        floating_point
    } vartype;  // Define one
    union {  // Anonymous union
        char c;
        int i;
        float f;
    };
public:
    SuperVar(char ch);
    SuperVar(int ii);
    SuperVar(float ff);
    void print();
};

SuperVar:: SuperVar(char ch)
{
    vartype = character;
    c = ch;
}

SuperVar:: SuperVar(int ii)
{
    vartype = integer;
    i = ii;
}

SuperVar:: SuperVar(float ff)
{
    vartype = floating_point;
    f = ff;
}

void SuperVar::print()
{
    switch (vartype) {
    case character:
        cout << "character: " << c << endl;
        break;
    case integer:
        cout << "integer: " << i << endl;
        break;
    case floating_point:
        cout << "float: " << f << endl;
        break;
    }
}

int main()
{
    SuperVar A('c'), B(12), C(1.44F);
    A.print();
    B.print();
    C.print();
} ///:~
